<?php
/**
  * wechat php test
  */

//define your token
//weixinabc是一个token,是一个令牌

// define("TOKEN", "weixinabc");
// $appid='wx9a6126ebf70d7eb0';
// $appsecret='e43017c0dedf0ee6bace7ceee3e5f687';
// $wechatObj=new wechatCallbackapiTest($appid, $appsecret);
// $wechatObj->createmeun();



//处理请求
//$wechatObj->responseMsg();
//$wechatObj->valid();
//exit;
namespace wx;
class Mywx
{
    private $appid;
    private $appsecret;
    
    
    
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
        	exit;
        }
    }

	//这个函数就是专门处理业务逻辑
	
	public function __construct($appID,$appsecret){
	    $this->appid=$appID;
	    $this->appsecret=$appsecret;
	    
	}
	
    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		//就是说如果我们的请求数据不是为空
		if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
				 //这里就是xml技术解析数据
                libxml_disable_entity_loader(true);
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
				//这个$event 就是事件具体内容
				$event = $postObj->Event;

				//如果我们做微信开发时，当需要调试输出信息，请将信息输出到文件中
				//oEevCjjxFTNdLScBF_Nhr5P6Tnwk(唯一的)  gh_4db56f3e4515（公众号） ok(关键字)
				file_put_contents("abc.bak", $fromUsername.'  '.$toUsername.' '.$keyword, FILE_APPEND);
                $time = time();
                $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";    
				
				//当用户关注我们微信平台时，会发送一个订阅的事件，我们就处理这个事件就ok

				switch($postObj->MsgType)
				{
					case 'event':
						//如果是用户订阅事件
						if($event == 'subscribe')
						{
							$contentStr = "welcome, sjlovefxy新闻系统 \r\n\r\n * 菜单如下 \r\n\r\n 1. 输入 新闻 就返回新闻条目\r\n\r\n 2.输入 听课 就返回最新流行的音乐\r\n\r\n 3.输入 大转盘 就会进入大转盘活动页面\r\n\r\n 4.发送你的地理位置返回你所在的信息\r\n\r\n 5.编写cxwz+你的关心的地址就会返回相关地理信息";
							//这里，我们先返回菜单，填充模板即可
							$msgType = 'text';
							$textTpl = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
							echo $textTpl;

						}
						break;
					case 'text':
						if($keyword  == '新闻')
						{	
							//返回新闻列表，先死后活[这里没有走数据库]
							$newsTplHeader = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[news]]></MsgType>
							<ArticleCount>%s</ArticleCount>
							<Articles>";
							//这里需要循环拼接
							$newsTplItem = "<item>
							<Title><![CDATA[%s]]></Title> 
							<Description><![CDATA[%s]]></Description>
							<PicUrl><![CDATA[%s]]></PicUrl>
							<Url><![CDATA[%s]]></Url>
							</item>";
							$newsTplFooter="</Articles>
							</xml>";
							
							//从数据库中循环取出新闻条目[这里的对数据库的操作可以写成一个工具文件]
							$connect = mysql_connect('localhost', 'root', 'ehp2015');
							mysql_select_db('mywx');
							mysql_query("SET NAMES UTF8");
							$sql = "SELECT title, description, picUrl, url FROM `newsImages` ORDER BY ids LIMIT 0, 10";
							$res = mysql_query($sql);
							
							$itemCount = 0;
							//循环取出
							while($row = mysql_fetch_assoc($res))
							{
									$contentStr .= sprintf($newsTplItem, $row['title'], $row['description'], $row['picUrl'], $row['url']);
									++$itemCount;
							}							
							//开始拼接返回的结果;
							$newsTplHeader = sprintf($newsTplHeader, $fromUsername, $toUsername, $time, $itemCount);
							$resultStr =  $newsTplHeader. $contentStr. $newsTplFooter;
							echo $resultStr; 
						}else if($keyword == '听歌')
						{
							//我们返回这个点播菜单
							$contentStr = "欢迎来到每学网的点播系统 \r\n\r\n 菜单如下 \r\n\r\n 1. 汪峰-北京北京 \r\n 2. 汪峰-存在 \r\n 3. 汪峰-生来彷徨 \r\n 输入对应歌曲的编号就可以听该歌曲 ";
							//返回
							$msgType = 'text';
							$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
							echo $resultStr;
						}
						//preg_match("/^[1-9](\d){0,2}$/", $keyword) 正则处理是 检测 $keyword是不是一个数，这个听不太懂，无所谓
						else if(preg_match("/^[1-9](\d){0,2}$/", $keyword))
						{
							//这里我又使用了经典 先死后活，便于理解
							if($keyword == '1')
							{
								$desc = '汪峰-北京北京';
							}else if($keyword == '2')
							{
								$desc = '汪峰-存在';
							}else if($keyword == '3')
							{
								$desc = '汪峰-生来彷徨';
							}else 
							{	
								//如果用户输入的这个编号，不存在，默认听第一首歌，完事！
								$desc = '汪峰-北京北京';
								$keyword = 1;
							}
							//关键地方来了！！！！，如何返回音乐->看微信文档
							$musicTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[music]]></MsgType>
							<Music>
							<Title><![CDATA[汪峰的音乐集合]]></Title>
							<Description><![CDATA[%s]]></Description>
							<MusicUrl><![CDATA[%s]]></MusicUrl>
							<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
							</Music>
							</xml>";
							
							//得到播放音乐的地址
							$musicUrl = "http://www.ehungpu.org/mp3/{$keyword}.mp3";
							//填充返回的结果
							$resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $desc, $musicUrl, $musicUrl);
							//返回
							echo $resultStr;
							
						}
						//我们规定，如果用户想查询某个关心的地方，要求用户必须这样输入 cxwz地方名称-》正则表达式
						else if(preg_match("/^cxwz([\x{4e00}-\x{9fa5}]+)/ui", $keyword, $res))
						{
							$address = $res[1];
							//还要取出这个用户的地理位置
							//从数据库中循环取出新闻条目[这里的对数据库的操作可以写成一个工具文件]
							$connect = mysql_connect('localhost', 'root', 'ehp2015');
							mysql_select_db('mywx');
							mysql_query("SET NAMES UTF8");
							//这里需要一个逻辑处理
							$sql = "SELECT longitude, latitude FROM `members` WHERE wxname='{$fromUsername}'";
							$res = mysql_query($sql);
							if($row = mysql_fetch_assoc($res))
							{
									//就根据用户的地理位置，查询该地点. ->LBS知识
									//$contentStr = "请点击该链接，就可以查询到该地点的信息  \r\n\r\n http://api.map.baidu.com/place/search?query=".urlencode($address)."&location={$row['latitude']},{$row['longitude']}&radius=1000&output=html&coord_type=gcj02";

									$contentStr = "点击以下网址可查看到您附近的".$address."信息:\r\n\r\nhttp://api.map.baidu.com/place/search?query=".urlencode($address)."&location=".$row["latitude"].",".$row["longitude"]."&radius=1000&output=html&coord_type=gcj02";
									
									$msgType = 'text';
									$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
									echo $resultStr;

									
							}else
							{
									//我们返回这个点播菜单
									$contentStr = "请你先上报地理位置";
									//返回
									$msgType = 'text';
									$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
									echo $resultStr;
							}
						}//当用户输入大转盘时，我们就返回大转盘
						else if($keyword == '大转盘')
						{
								//返回一个连接即可
									$contentStr = "请你点击连接 就可以玩 幸运大转盘了 \r\n\r\n http://www.ehuangpu.org/pan/index.php ";
									//返回
									$msgType = 'text';
									$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
									echo $resultStr;
						}
						//当用户输入刮奖时，我们进行处理
						else if($keyword == '刮奖')
						{
								//返回刮奖页面, 因为时间的关系，我就不在敲代码，我们把准好的案例，拷贝一下讲解.
								//返回一个图文消息->没有操作数据库，同学们可以自己添加.
								$luckyTpl = "<xml>
								<ToUserName><![CDATA[%s]]></ToUserName>
								<FromUserName><![CDATA[%s]]></FromUserName>
								<CreateTime>%s</CreateTime>
								<MsgType><![CDATA[news]]></MsgType>
								<ArticleCount>4</ArticleCount>
								<Articles>
								<item>
								<Title><![CDATA[刮刮乐中心]]></Title> 
								<Description><![CDATA[刮刮乐中心]]></Description>
								<PicUrl><![CDATA[http://www.ehuangpu.org/image/gg1.png]]></PicUrl>
								<Url><![CDATA[http://www.ehuangpu.org]]></Url>
								</item>
								<item>
								<Title><![CDATA[可能是一等奖]]></Title>
								<Description><![CDATA[可能是一等奖]]></Description>
								<PicUrl><![CDATA[http://www.ehuangpu.org/image/gg1.png]]></PicUrl>
								<Url><![CDATA[%s]]></Url>
								</item>
								<item>
								<Title><![CDATA[可能是二等奖]]></Title>
								<Description><![CDATA[可能是二等奖]]></Description>
								<PicUrl><![CDATA[http://www.ehuangpu.org/image/gg2.png]]></PicUrl>
								<Url><![CDATA[%s]]></Url>
								</item>
								<item>
								<Title><![CDATA[可能是三等奖]]></Title>
								<Description><![CDATA[可能是三等奖]]></Description>
								<PicUrl><![CDATA[http://www.ehuangpu.org/image/gg2.png]]></PicUrl>
								<Url><![CDATA[%s]]></Url>
								</item>
								</Articles>
								</xml>";

								//填充模板
								$gglArr = array();
								for($i = 0; $i < 3; $i++)
								{
									$gglArr[$i] = "http://www.ehuangpu.org/ggl/ggl".rand(1, 3).".html";
								}
								$resultStr = sprintf($luckyTpl, $fromUsername, $toUsername, $time, $gglArr[0], $gglArr[1], $gglArr[2]);
								echo $resultStr;

						}
						//如果用户输入的文字，不对，我们给他一个提示
						else 
						{
							//我们返回这个点播菜单
							$contentStr = "您的输入格式有问题，请重新输入";
							//返回
							$msgType = 'text';
							$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
							echo $resultStr;
						}
						break;
						//如果用户上传的是地理位置，则类型是location
					case 'location':
						//获取到用户的经度和纬度
						//经度
						$Location_Y = $postObj->Location_Y;
						$Location_X = $postObj->Location_X;
						$contentStr = "您好! 我们已经收到您上报的地理位置 \r\n\r\n 经度  {$Location_Y} \r\n 纬度 {$Location_X} \r\n\r\n 请你输入你关心的地方，即可查询";
						//返回
						$msgType = 'text';
						$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
						echo $resultStr;
						//将得到的经度和纬度入库,后面需要用到.
						//创建一张表 -members,用于保存地址
						//这里，我就直接连数据库.
						//从数据库中循环取出新闻条目[这里的对数据库的操作可以写成一个工具文件]
						$connect = mysql_connect('localhost', 'root', 'ehp2015');
						mysql_select_db('mywx');
						mysql_query("SET NAMES UTF8");
						//这里需要一个逻辑处理
						$sql = "SELECT wxname FROM `members` WHERE wxname='{$fromUsername}'";
						$res = mysql_query($sql);
						//1.判断如果用户已经存在，我们是更新地理位置
						if($row = mysql_fetch_assoc($res))
						{
							//更新
							$sql = "UPDATE `members` SET longitude='{$Location_Y}' , latitude = '{$Location_X}', join_time='{$time}' WHERE wxname='{$fromUsername}'";
							mysql_query($sql);
						}else
						{
							//2.如果用户不存在，说明第一次来，就是添加
							$sql = "INSERT INTO `members` (wxname, longitude, latitude, join_time) VALUES('{$fromUsername}', '{$Location_Y}', '{$Location_X}', '$time')";
							mysql_query($sql);
						}
					
						break;
					default:
						break;
				}
				
				//如果用户输入不为空
				/*if(!empty( $keyword ))
                {
              		$msgType = "text";
					if($keyword == 'OK')
					{
							$contentStr = "hello,每学网! OK!";
					}else
					{

						preg_match('/(\d+)([+-])(\d+)/i', $keyword, $res);
						//switch()
						if($res[2] == '+')
						{
							$result = $res[1] + $res[3];
						}else if($res[2] == '-')
						{
							$result = $res[1] - $res[3];
						}
					//返回的内容是 "Welcome to wechat world!"
                	$contentStr = "Welcome to wechat world! 运算结果是". $result;
					}
					//填充模板
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
					//echo 就是返回
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }*/

        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        		
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );
		
		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
	
	
	    function curl_get(){
	    
	        $head = [
	            'User-Agent: Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
	            'X-FORWARDED-FOR:154.125.25.15',
	            'CLIENT-IP:154.125.25.15'
	        ];
	    
	        $ch = curl_init($this->url);
	        curl_setopt($ch, CURLOPT_HEADER, false);
	        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	        curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
	        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
	        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	        $data = curl_exec($ch);
	        curl_close($ch);
	        return $data;
	    }
	    public function https_request($url,$data = null){
	        $curl = curl_init();
	        curl_setopt($curl, CURLOPT_URL, $url);
	        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
	        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
	        if (!empty($data)){
	            curl_setopt($curl, CURLOPT_POST, 1);
	            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	        }
	        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	        $output = curl_exec($curl);
	        curl_close($curl);
	        return $output;
	    }
	
	
	public function get_access_token(){
	    $lifeTime=2*3600;
	    session_set_cookie_params($lifeTime);
	    session_start();
	    if(empty($_SESSION['access_token']&&$_SESSION['access_token']==""))
	    {
	       $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret";
	       $json=$this->https_request($url);
	       $access_obj=json_decode($json);
	       $access=$access_obj->access_token;
	       $_SESSION['access_token']=$access;
	        
	    }
	    return $_SESSION['access_token'];
	   
	  
	    
	}
	//这里是创建按钮 删除按钮 都可以进行封装
	public function createmeun($access_token){
	    //获得access_token
	    $url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token";
	    $data='{
     "button":[
     {	
          "type":"view",
          "name":"测试2",
          "url":"http://www.ehuangpu.org/"
      },
	      {	
          "type":"view",
          "name":"哈哈",
          "url":"http://data.ehuangpu.org/"
      },
	        {	
          "type":"view",
          "name":"这个",
          "url":"http://www.baidu.com/"
      }
	        
	        
	        ]
 }';
	   $msg=$this->https_request($url,$data);
	   var_dump($msg);
	   $code=json_decode($msg);
	   if($code->errcode=='0'){
	      return 'sucess';
	   }
	   
	  	}
	  	//菜单的查询
	  	
	  	public function menu_get($url,$access_token){
	  	   
	  	    try {
	  	          $url=$url.$access_token;//这是https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
	  	        
	  	         return   $this->https_request($url);
	  	        
	  	    }catch (Exception $e){
	  	        print ($e->getMessage());
	  	    }
	  	}
}

?>